package com.wangshb.agent.study.javassist;

import javassist.*;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * 利用javassist实现添加成员变量, 实现加法操作
 * @author wangsb12
 */
public class FieldStudy {

    public static void main(String[] args) throws Exception {

        ClassPool pool = ClassPool.getDefault();

        // 创建一个java类
        CtClass ctClass = pool.makeClass("com.wangshb.agent.javassist.FieldStudy");

        // 定义一个变量 a
        CtField ctField = new CtField(CtClass.doubleType, "a", ctClass);
        ctField.setModifiers(Modifier.PRIVATE + Modifier.STATIC + Modifier.FINAL);
        ctClass.addField(ctField, "3.14");

        // 执行 + 1
        CtMethod ctMethod = new CtMethod(CtClass.doubleType, "add", new CtClass[]{CtClass.doubleType}, ctClass);
        ctMethod.setModifiers(Modifier.PUBLIC);

        // $1 是方法的参数，按$1, $2... 顺序， $0为this
        ctMethod.setBody("{return a + $1;}");
        ctClass.addMethod(ctMethod);

//        CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass);
//        ctConstructor.setBody("{}");
//        ctClass.addConstructor(ctConstructor);

//        ctClass.writeFile();

        Class<?> aClass = ctClass.toClass();
        Object o = aClass.newInstance();
        Method main = aClass.getDeclaredMethod("add", double.class);
        Object invoke = main.invoke(o,  10);
        System.out.println(invoke);
    }
}
